#include <AT89X52.h>
#include <stdio.h>

#include "key.h"
#include "led.h"
#include "uart.h"
#include "pdiusbd12.h"
#include "UsbCore.h"

/***
"******                  请按K1-K8分别进行测试                 ******\r\n",
"******    K1:光标左移  K2:光标右移  K3:光标上移 K4:光标下移   ******\r\n",
"******    K5:滚轮下滚  K6:滚轮上滚  K7:鼠标左键 K8:鼠标右键   ******\r\n",
*/

/********************************************************************
函数功能：根据按键情况返回报告的函数。
入口参数：无。
返    回：无。
备    注：无。
********************************************************************/
void SendReport(void)
{
	//需要返回的4字节报告的缓冲
	//Buf[0]的D0就是左键，D1就是右键，D2就是中键（这里没有）
	//Buf[1]为X轴，Buf[2]为Y轴，Buf[3]为滚轮
	uint8_t Buf[4]={0,0,0,0};
	
	//我们不需要KEY1~KEY6按键改变的信息，所以先将它们清0
	KeyUp &=~(KEY1|KEY2|KEY3|KEY4|KEY5|KEY6);
	KeyDown &=~(KEY1|KEY2|KEY3|KEY4|KEY5|KEY6);
	
	//如果有按键按住，并且不是KEY7、KEY8（左、右键）
	//或者KEY7、KEY8任何一个键有变动的话，则需要返回报告
	if((KeyPress&(~(KEY7|KEY8)))||KeyUp||KeyDown)
	{
		if(KeyPress & KEY1) //如果KEY1按住，则光标需要左移，即X轴为负值。
		{
			Buf[1]=-1;  //这里一次往左移动一个单位。
		}
		if(KeyPress & KEY2) //如果KEY2按住，则光标需要右移，即X轴为正值。
		{
			Buf[1]=1;   //这里一次往右移动一个单位。
		}
		if(KeyPress & KEY3) //如果KEY3按住，则光标需要上移，即Y轴为负值。
		{
			Buf[2]=-1;   //这里一次往上移动一个单位。
		}
		if(KeyPress & KEY4)  //如果KEY4按住，则光标需要下移，即Y轴为正值。
		{
			Buf[2]=1;  //这里一次往下移动一个单位。
		}
		if(KeyPress & KEY5)  //如果KEY5按住，则滚轮下滚，即滚轮值为负。
		{
			Buf[3]=-1;  //这里一次往下滚动一个单位。
		}
		if(KeyPress & KEY6)  //如果KEY6按住，则滚轮上滚，既滚轮值为正
		{
			Buf[3]=1;   //这里一次往上滚动一个单位。
		}
		if(KeyPress & KEY7)  //鼠标左键
		{
			Buf[0]|=0x01;  //D0为鼠标左键
		}
		if(KeyPress & KEY8)  //鼠标右键
		{
			Buf[0]|=0x02;  //D1为鼠标右键
		}
		//报告准备好了，通过端点1返回，长度为4字节。

		D12WriteEndPointBuffer(3,4,Buf);
		Ep1InIsBusy=1;  //设置端点忙标志。
	}
	//记得清除KeyUp和KeyDown
	KeyUp=0;
	KeyDown=0;
}

void main(void)
{
	uint16_t D12_id = 0;
	uint8_t irqSrc = 0;
	ConfigValue = 0;
	EA = 1;
	InitKeyBoard();
	InitUart();
	printf("Init uart SUCCESS......\r\n");
	D12_id = D12ReadID();
	if(D12_id==PDIUSB_DEV_ID)
	{
		printf("Read ID(0x%04x) is correct! Congratulations!\r\n", D12_id);
	}
	else
	{
		Prints(". ID is incorrect! What a pity!\r\n\r\n");
	}

	UsbDisconnect();
	UsbConnect();
	
	while(1)
	{
#if 0
		LEDs = ~KeyPress;
		if(KeyDown)		  //�м�����
		{              //�������µļ�
		   if(KeyDown&KEY1)
		   {
				Prints("KEY1 down\r\n");
				KeyDown&=~KEY1;
		   }
		   if(KeyDown&KEY2)
		   {
				Prints("KEY2 down\r\n");
				KeyDown&=~KEY2;
		   }
		   if(KeyDown&KEY3)
		   {
				Prints("KEY3 down\r\n");
				KeyDown&=~KEY3;
		   }
		   if(KeyDown&KEY4)
		   {
				Prints("KEY4 down\r\n");
				KeyDown&=~KEY4;
		   }
		   if(KeyDown&KEY5)
		   {
				Prints("KEY5 down\r\n");
				KeyDown&=~KEY5;
		   }
		   if(KeyDown&KEY6)
		   {
				Prints("KEY6 down\r\n");
				KeyDown&=~KEY6;
		   }
		   if(KeyDown&KEY7)
		   {
				Prints("KEY7 down\r\n");
				KeyDown&=~KEY7;
		   }
		   if(KeyDown&KEY8)
		   {
				Prints("KEY8 down\r\n");
				KeyDown&=~KEY8;
		   }
		}
		if(KeyUp)
		{
		   if(KeyUp&KEY1)
		   {
				Prints("KEY1 up\r\n");
				KeyUp&=~KEY1;
		   }
		   if(KeyUp&KEY2)
		   {
				Prints("KEY2 up\r\n");
				KeyUp&=~KEY2;
		   }
		   if(KeyUp&KEY3)
		   {
				Prints("KEY3 up\r\n");
				KeyUp&=~KEY3;
		   }
		   if(KeyUp&KEY4)
		   {
				Prints("KEY4 up\r\n");
				KeyUp&=~KEY4;
		   }
		   if(KeyUp&KEY5)
		   {
				Prints("KEY5 up\r\n");
				KeyUp&=~KEY5;
		   }
		   if(KeyUp&KEY6)
		   {
				Prints("KEY6 up\r\n");
				KeyUp&=~KEY6;
		   }
		   if(KeyUp&KEY7)
		   {
				Prints("KEY7 up\r\n");
				KeyUp&=~KEY7;
		   }
		   if(KeyUp&KEY8)
		   {
				Prints("KEY8 up\r\n");
				KeyUp&=~KEY8;
		   }
		}
#endif
		// get usb irq status.
		if(D12GetIntPin() == 0)
		{
			D12WriteCommand(READ_INTERRUPT_REGISTER);
			irqSrc = D12ReadByte();
			printf("in irq\r\n");
			if(irqSrc & 0x40) UsbBusReset();
			if(irqSrc & 0x80) UsbBusSuspend();
			if(irqSrc & 0x01) UsbEp0Out();
			if(irqSrc & 0x02) UsbEp0In();
			if(irqSrc & 0x04) UsbEp1Out();
			if(irqSrc & 0x08) UsbEp1In();
			if(irqSrc & 0x10) UsbEp2Out();
			if(irqSrc & 0x20) UsbEp2In();
		}
		if(ConfigValue != 0)
		{
			LEDs = ~KeyPress;
			if(!Ep1InIsBusy)
			{
				keyCanChange = 0;
				if(KeyUp || KeyDown || KeyPress) // 如果有按键事件发生
				{
					SendReport(); // 返回报告
				}
				keyCanChange = 1;
			}
		}
	}
}



